#include <CtrlLib/CtrlLib.h>

using namespace Upp;

#include "Dialogs.h"

extern PostgreSQLSession pg_session;

ListadoSolicitudesDlg::ListadoSolicitudesDlg()
{
	CtrlLayoutCancel(*this, "Listado de Solicitudes de Socios");
	MaximizeBox().MinimizeBox();
	Sizeable().Zoomable();
	Icon(CentroJyPImg::icono_min32x32(),CentroJyPImg::icono());
	cancel.SetImage(CentroJyPImg::cancelar());
	Maximize();
	
	ayuda_btn.SetImage(CentroJyPImg::help_contents16x16());
	agregar_btn.SetImage(CentroJyPImg::agregar_pote_afiliado());
	editar_btn.SetImage(CentroJyPImg::editar_pote_afiliado());
	eliminar_btn.SetImage(CentroJyPImg::eliminar_pote_afiliado());
	registrar_socio_btn.SetImage(CentroJyPImg::dar_alta16x16());
	rechazar_socio_btn.SetImage(CentroJyPImg::rechazar_usuario16x16());
	comprobante_btn.SetImage(CentroJyPImg::imp_comprobante());
	listaActivos_btn.SetImage(CentroJyPImg::clientes_img40x40());
	listaAdherentes_btn.SetImage(CentroJyPImg::adherentes());
	
	AddFrame(menu);
	AddFrame(TopSeparatorFrame());
	menu.Set(THISBACK(MenuPrincipal));
	
	// Se completan las columnas de la vista de lista de afiliados
	potenciales_afiliados.SetSession(pg_session);
	potenciales_afiliados.SetTable(SOLICITUD,DNI);
	
	potenciales_afiliados.AddColumn(TIPO_DOC,"Tipo Documento").NoEdit();
	potenciales_afiliados.AddColumn(DNI,"Documento").NoEdit().Sorting();
	potenciales_afiliados.AddColumn(APELLIDOS,"Apellido/s y Nombres/s").NoEdit().Sorting();
/*	potenciales_afiliados.AddColumn(NOMBRES,"Nombre/s").NoEdit();*/
	potenciales_afiliados.AddColumn(FECHA_NAC,"Fecha Nac.").NoEdit();
	potenciales_afiliados.AddColumn(NRO_SOCIO,"Nro. Socio").NoEdit().Sorting();
	potenciales_afiliados.AddColumn(CALLE,"Calle").NoEdit();
	potenciales_afiliados.AddColumn(TEL,"Tel.").NoEdit();
	potenciales_afiliados.SetOrderBy(APELLIDOS);
	potenciales_afiliados.WhenLeftDouble = THISBACK(ModificarAfiliado);
	potenciales_afiliados.Query();
	potenciales_afiliados.GoEndPostQuery();
	cant_solicitudes.SetText(AsString(potenciales_afiliados.GetCount()));
	
	agregar_btn <<= THISBACK(AgregarAfiliado);
	editar_btn <<= THISBACK(ModificarAfiliado);
	eliminar_btn <<= THISBACK(EliminarAfiliado);
	registrar_socio_btn <<= THISBACK(RegistrarSocio);
	rechazar_socio_btn <<= THISBACK(RechazarSocio);
	comprobante_btn <<= THISBACK(GenerarComprobante);
	ayuda_btn <<= THISBACK(Ayuda);
	listaActivos_btn <<= THISBACK(IrActivos);
	listaAdherentes_btn <<= THISBACK(IrAdherentes);
}

void ListadoSolicitudesDlg::AgregarAfiliado()
{
	AltaSolicitudSocio alta;
	alta.SetListaPrincipal(potenciales_afiliados);
	alta.Execute();
}

void ListadoSolicitudesDlg::ModificarAfiliado()
{
	if (potenciales_afiliados.IsCursor()) {
		ModificarSolicitudSocio modificar;
		String dni_ = potenciales_afiliados.GetKey();
		modificar.EditandoAfiliado(dni_);
		modificar.SetListaPrincipal(potenciales_afiliados);
		modificar.Execute();
	}
}

void ListadoSolicitudesDlg::EliminarAfiliado()
{
	if (potenciales_afiliados.IsCursor() && PromptYesNo("¿Está seguro que quiere eliminar este afiliado?")) {
		
		if (! (SQL * Delete(SOLICITUD).Where(DNI == potenciales_afiliados.GetKey()))) {
			Exclamation(SQL.GetLastError());
			return;
		}
		
		potenciales_afiliados.Query();
		potenciales_afiliados.GoEndPostQuery();
	}
}

void ListadoSolicitudesDlg::RegistrarSocio()
{
	if (potenciales_afiliados.IsCursor()) {
		RegistroSocioDlg registro_socio;
		registro_socio.SetListaPrincipal(potenciales_afiliados);
		registro_socio.RegistrandoSocio(potenciales_afiliados.GetKey());
		registro_socio.Execute();
	}
}

/**
 Cuando se elige esta opción, se rechaza la solicitud previamente agregada. al rechazar la
 solicitud, se elimina de la base de datos.
*/
void ListadoSolicitudesDlg::RechazarSocio()
{
	if (potenciales_afiliados.IsCursor()) {
		if (PromptYesNo("¿Esta seguro que desea rechazar la solicitud seleccionada?")) {
			
			SqlId ALL("*");
			if (! (SQL * Select(ALL).From(SOLICITUD).Where(DNI == potenciales_afiliados.GetKey()))) {
				Exclamation(SQL.GetLastError());
				return;
			}
			
			Sql sql(pg_session);
			while (SQL.Fetch()) {
				if (! (sql * Insert(SOLICITUD_RECHAZADA) (DNI_R,SQL[DNI])(APELLIDOS_R,SQL[APELLIDOS])(FECHA_NAC_R,SQL[FECHA_NAC])
						(TIPO_DOC_R,SQL[TIPO_DOC])(CALLE_R,SQL[CALLE])(NRO_CALLE_R,SQL[NRO_CALLE])(PISO_R,SQL[PISO])(DPTO_R,SQL[DPTO])
						(BARRIO_R,SQL[BARRIO])(CIUDAD_R,SQL[CIUDAD])(TEL_R,SQL[TEL])(TEL_ALT_R,SQL[TEL_ALT])(MAIL_R,SQL[MAIL])
						(NRO_SOCIO_R,SQL[NRO_SOCIO])(LEY_R,SQL[LEY])(TIPO_SOCIO_R,SQL[TIPO_SOCIO])(BENEFICIO_R,SQL[BENEFICIO])
						(REPARTICION_R,SQL[REPARTICION])(CARGO_R,SQL[CARGO])(CATEGORIA_R,SQL[CATEGORIA])(HABER_R,SQL[HABER])
						(FECHA_BAJA,GetSysDate()))) {
					
					Exclamation(sql.GetLastError());
					return;
				}
			}
			
			if (! (SQL * Delete(SOLICITUD).Where(DNI == potenciales_afiliados.GetKey()))) {
				Exclamation(SQL.GetLastError());
				return;
			}
			
			PromptOK("La solicitud se ha eliminado exitosamente");
			potenciales_afiliados.Query();
		}
	}
}

/**
 Genera el comprobante del afiliado que se ha seleccionado. El comprobante es el reporte
 donde figuran los datos para aprobar/rechazar una solicitud.
*/
void ListadoSolicitudesDlg::GenerarComprobante()
{
	if (potenciales_afiliados.IsCursor()) {
		ConfigurarFormularioSolicitud conf(potenciales_afiliados.GetKey());
	}
}

/**
 Acceso directo a la lista de afiliado activos.
*/
void ListadoSolicitudesDlg::IrActivos()
{
	Hide();
	Close();
	ListadoAfiliadosDlg().Run();
}

/**
 Acceso directo a la lista de afiliados adherentes.
*/
void ListadoSolicitudesDlg::IrAdherentes()
{
	Hide();
	Close();
	ListadoAfiliadosAdherentesDlg().Run();
}

/**
 Opciones del menu de la ventana.
*/
void ListadoSolicitudesDlg::MenuPrincipal(Bar& bar)
{
	bar.Add("Archivo",THISBACK(MenuArchivo));
	bar.Add("Solicitud",THISBACK(MenuSolicitud));
	bar.Add("Ver",THISBACK(MenuVer));
}

void ListadoSolicitudesDlg::MenuArchivo(Bar& bar)
{
	bar.Add("Salir",THISBACK(Salir));
}

void ListadoSolicitudesDlg::MenuSolicitud(Bar& bar)
{
	bar.Add("Nueva Solicitud",CentroJyPImg::agregar_pote_afiliado(),THISBACK(AgregarAfiliado))
	.Tip("Permite agregar una nueva solicitud de socio")
	.Key(K_CTRL_N);
	bar.Add("Modificar Solicitud",CentroJyPImg::editar_pote_afiliado(),THISBACK(ModificarAfiliado))
	.Tip("Permite modificar las propiedades definidas para la solicitud seleccionada")
	.Key(K_CTRL_M)
	.Enable(potenciales_afiliados.IsCursor());
	bar.Add("Eliminar Solicitud",CentroJyPImg::eliminar_pote_afiliado(),THISBACK(EliminarAfiliado))
	.Tip("Permite eliminar el afiliado seleccionado")
	.Key(K_CTRL_E)
	.Enable(potenciales_afiliados.IsCursor());
}

void ListadoSolicitudesDlg::MenuVer(Bar& bar)
{
	bar.Add("Solicitudes Rechazadas",CentroJyPImg::listado_sol_rechazadas(),THISBACK(SolicitudesRechazadas))
	.Tip("Permite obtener el listado de las solicitudes que se han rechazado");
	bar.Add("Formulario",CentroJyPImg::imp_comprobante(),THISBACK(GenerarComprobante))
	.Enable(potenciales_afiliados.IsCursor())
	.Tip("Genera el formulario de solicitud de nuevo socio");
}

void ListadoSolicitudesDlg::SolicitudesRechazadas()
{
	ListadoSolicitudesRechazadasDlg solic_rech;
	solic_rech.SetListaSolicitudes(potenciales_afiliados);
	solic_rech.SetLabel(cant_solicitudes);
	solic_rech.Execute();
}

void ListadoSolicitudesDlg::Salir()
{
	Break();
}

void ListadoSolicitudesDlg::Ayuda()
{
	HelpWindow help;
	help.GoTo("topic://CentroJyP/app/AyudaGestionSolicitudes$es-es");
	help.Execute();
}

//==============================================================================================

AltaSolicitudSocio::AltaSolicitudSocio()
{
	CtrlLayoutCancel(*this, "Solicitud de Nuevo Socio");
	Icon(CentroJyPImg::icono_min32x32(),CentroJyPImg::icono());
	guardar_btn.SetImage(CentroJyPImg::dialog_apply16x16());
	cancel.SetImage(CentroJyPImg::cancelar());
	
	tipo_dni.Add("- Tipo -")
		.Add("DNI")
		.Add("LC")
		.Add("LE")
		.Add("Pasaporte");
		
	tipo_dni.SetIndex(0);
	nro_dni.NullText("34255796");
	
	fecha.NullText(AsString(GetSysDate()));
	mail.NullText("usuario@ejemplo.com");
	
	sql_ctrls
		(DNI,nro_dni)
		(APELLIDOS,apellido)
		(FECHA_NAC,fecha)
		(CALLE,calle)
		(NRO_CALLE,numero_calle)
		(PISO,piso)
		(DPTO,dpto)
		(BARRIO,barrio)
		(CIUDAD,ciudad)
		(TEL,tel_numero)
		(TEL_ALT,tel_numero_alter)
		(MAIL,mail)
		(NRO_SOCIO,nro_socio)
		(LEY,ley)
		(REPARTICION,reparticion)
		(CARGO,cargo)
		(CATEGORIA,categoria)
		(HABER,haber)
	;
	
	tipo_socio = 0;
	beneficio = 0;
	
	guardar_btn <<= THISBACK(InsertarSolicitud);
}

bool AltaSolicitudSocio::EmailValido(String email)
{
	int pos_arroba = -1, pos_punto = -1;
	
	for (unsigned int i = 0 ; i < email.GetLength() ; i++) {
		if (email[i] == 64)
			pos_arroba = i;
		else if (email[i] == 46)
			pos_punto = i;
	}
	
	if (pos_arroba == -1 || pos_punto == -1)
		return false;
	
	if (pos_arroba > pos_punto)
		return false;

	if (pos_punto == email.GetLength())
		return false;
	
	return true;
}

bool AltaSolicitudSocio::esLetra(int c)
{
	if (c < 65 || (c > 90 && c < 97) || c > 122)
		return false;
	
	return true;
}

/**
 Se controla que tanto el nombre como el apellido, sean válidos,
 es decir, retornará true si el nombre o apellido contienen solo
 letras, en caso contrario false.
*/
bool AltaSolicitudSocio::NombreyApellidoValido(String nombre)
{
	bool valido = true;
	
	for (int i = 0 ; i < nombre.GetLength() && valido ; i++) {
		if ((esLetra(nombre[i])) || (nombre[i] == 32))
			valido = true;
		else
			valido = false;
	}
	
	return valido;
}

/**
 Permite comprobar si el DNI ingresado es correcto.
 Retornará true si el dni contiene solo números, en caso
 contrario retornará false
*/
bool AltaSolicitudSocio::DocumentoValido(String dni)
{
	for (int i = 0 ; i < dni.GetLength() ; i++) {
		if (dni[i] < 48 || dni[i] > 57)
			return false;
	}
	return true;
}

/**
 Se comprueba que el número de telefono sea solo numeros, y no contenga
 algún otro caracter.
 Retornará true si el telefono contiene solo números, en caso contrario 
 retornará false
*/
bool AltaSolicitudSocio::ValidarTelefono(String telefono_)
{
	for (int i = 0 ; i < telefono_.GetLength() ; i++) {
		if (telefono_[i] < 48 || telefono_[i] > 57)
			return false;
	}
	return true;
}

/**
 Permite insertar el nuevo afiliado a la base de datos, controlando
 que los datos sean correctos.
*/
void AltaSolicitudSocio::InsertarSolicitud()
{
	String tipo_doc;
	if (apellido.GetData().IsNull()) {
		Exclamation("Debe ingresar el/los apellido/s");
		return;
	}
	
	if (! NombreyApellidoValido(apellido.GetData())) {
		Exclamation("El apellido debe contener sólo letras");
		return;
	}
	
	if (fecha.GetData().IsNull()) {
		Exclamation("Debe ingresar la fecha de nacimiento.");
		return;
	}
	
	if (! fecha.Accept())
		return;
	
	if (tipo_dni.GetIndex() == 0) {
		Exclamation("Debe elegir el tipo de documento");
		return;
	}
	if (tipo_dni.GetIndex() == 1)
		tipo_doc = "DNI";
	if (tipo_dni.GetIndex() == 2)
		tipo_doc = "LC";
	if (tipo_dni.GetIndex() == 3)
		tipo_doc = "LE";		
	if (tipo_dni.GetIndex() == 4)
		tipo_doc = "Pasaporte";
	
	if (nro_dni.GetLength() < 7) {
		Exclamation("El formato del documento es incorrecto");
		return;
	}
	
	if (! DocumentoValido(nro_dni.GetData())) {
		Exclamation("El Documento debe contener sólo números");
		return;
	}
	
	if (calle.GetData().IsNull()) {
		Exclamation("Debe ingresar la calle");
		return;
	}
		
	if (numero_calle.GetData().IsNull()) {
		Exclamation("Debe ingresar el número de calle");
		return;
	}
	
	if (ciudad.GetData().IsNull()) {
		Exclamation("Debe ingresar la ciudad");
		return;	
	}
	
	if (tel_numero.GetData().IsNull()) {
		Exclamation("Debe ingresar el número de teléfono");
		return;
	}
	
	if (! ValidarTelefono(tel_numero.GetData())) {
		Exclamation("El telefono ingresado es incorrecto. Compruebe que contiene solo números");
		return;
	}
	
	if (! tel_numero_alter.GetData().IsNull()) {
		if (! ValidarTelefono(tel_numero_alter.GetData())) {
			Exclamation("El telefono alternativo es incorrecto. Compruebe que contiene sólo números");
			return;
		}
	}
	
	if (! mail.GetData().IsNull()) {
		if (! EmailValido(mail.GetData())) {
			Exclamation("La dirección de e-mail parece no ser una dirección válida. Compruebe que es correcta e intente nuevamente");
			return;
		}
	}
	
	if (nro_socio.GetData().IsNull()) {
		Exclamation("Debe ingresar el Nro. de Socio");
		return;
	}
	
	if (ley.GetData().IsNull()) {
		Exclamation("Debe ingresar la ley");
		return;
	}
	
	if (ley.GetLength() == 1) {
		Exclamation("La ley debe ser de dos dígitos");
		return;
	}
	
	if (! (SQL * sql_ctrls.Insert(SOLICITUD) (TIPO_DOC,tipo_doc) (TIPO_SOCIO,~tipo_socio) (BENEFICIO,~beneficio))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	
	Hide();
	
	if (PromptYesNo("La solicitud se ha registrado exitosamente. ¿Desea generar comprobante?"))
		GenerarComprobante(nro_dni.GetData());
	
	lista_padre -> Query();
	lista_padre -> GoEndPostQuery();
	Close();
}

void AltaSolicitudSocio::GenerarComprobante(String dni_)
{
	ConfigurarFormularioSolicitud config(dni_);
}

//==============================================================================================

ModificarSolicitudSocio::ModificarSolicitudSocio()
{
	CtrlLayoutCancel(*this, "Modificar Afiliado");
	Icon(CentroJyPImg::icono_min32x32(),CentroJyPImg::icono());
	guardar_btn.SetImage(CentroJyPImg::formattingico());
	cancel.SetImage(CentroJyPImg::cancelar());
	
	fecha.NullText(AsString(GetSysDate()));
	tipo_dni.Add("- Tipo -")
		.Add("DNI")
		.Add("LC")
		.Add("LE")
		.Add("Pasaporte");
	
	nro_dni.NullText("34255796");
	mail.NullText("usuario@ejemplo.com");
	
	sql_ctrls
		(DNI,nro_dni)
		(APELLIDOS,apellido)
		(FECHA_NAC,fecha)
		(CALLE,calle)
		(NRO_CALLE,numero_calle)
		(PISO,piso)
		(DPTO,dpto)
		(BARRIO,barrio)
		(CIUDAD,ciudad)
		(TEL,tel_numero)
		(TEL_ALT,tel_numero_alter)
		(MAIL,mail)
		(NRO_SOCIO,nro_socio)
		(LEY,ley)
		(REPARTICION,reparticion)
		(CARGO,cargo)
		(CATEGORIA,categoria)
		(HABER,haber)
	;
}

void ModificarSolicitudSocio::EditandoAfiliado(String dni_)
{
	dni_seleccionado = dni_;
	if (! (SQL * Select(sql_ctrls).From(SOLICITUD).Where(DNI == dni_))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	
	if (! sql_ctrls.Fetch(SQL))
		return;
	
	if (! (SQL * Select(TIPO_DOC,TIPO_SOCIO,BENEFICIO).From(SOLICITUD).Where(DNI == dni_))) {
		Exclamation(SQL.GetLastError());
		return;
	}

	while (SQL.Fetch()) {
		if (SQL[TIPO_DOC] == "DNI")
			tipo_dni.SetIndex(1);
		if (SQL[TIPO_DOC] == "LC")
			tipo_dni.SetIndex(2);
		if (SQL[TIPO_DOC] == "LE")
			tipo_dni.SetIndex(3);
		if (SQL[TIPO_DOC] == "Pasaporte")
			tipo_dni.SetIndex(4);
	//	tipo_dni.SetIndex(SQL[TIPO_DOC]);
		tipo_socio <<= SQL[TIPO_SOCIO];
		beneficio <<= SQL[BENEFICIO];
	}
	guardar_btn <<= THISBACK(GuardarModificacion);
}

bool ModificarSolicitudSocio::esLetra(int c)
{
	if (c < 65 || (c > 90 && c < 97) || c > 122)
		return false;
	
	return true;
}

/**
 Controla que el apellido y el nombre contengan solo letras y espacios.
 retornará true si contiene letras y espacios, en caso contrario retornará false.
*/
bool ModificarSolicitudSocio::NombreyApellidoValido(String nombre)
{
	bool valido = true;
	
	for (int i = 0 ; i < nombre.GetLength() && valido ; i++) {
		if ((esLetra(nombre[i])) || (nombre[i] == 32))
			valido = true;
		else
			valido = false;
	}
	
	return valido;
}

bool ModificarSolicitudSocio::DocumentoValido(String dni)
{
	for (int i = 0 ; i < dni.GetLength() ; i++) {
		if (dni[i] < 48 || dni[i] > 57)
			return false;
	}
	return true;
}

bool ModificarSolicitudSocio::EmailValido(String email)
{
	int pos_arroba = -1, pos_punto = -1;
	
	for (unsigned int i = 0 ; i < email.GetLength() ; i++) {
		if (email[i] == 64)
			pos_arroba = i;
		else if (email[i] == 46)
			pos_punto = i;
	}
	
	if (pos_arroba == -1 || pos_punto == -1)
		return false;
	
	if (pos_arroba > pos_punto)
		return false;

	if (pos_punto == email.GetLength())
		return false;
	
	return true;
}

bool ModificarSolicitudSocio::ValidarTelefono(String telefono_)
{
	for (int i = 0 ; i < telefono_.GetLength() ; i++) {
		if (telefono_[i] < 48 || telefono_[i] > 57)
			return false;
	}
	return true;
}

void ModificarSolicitudSocio::GuardarModificacion()
{
	String tipo_doc;
	if (apellido.GetData().IsNull()) {
		Exclamation("Debe ingresar el/los apellido/s");
		return;
	}
	
	if (! NombreyApellidoValido(apellido.GetData())) {
		Exclamation("El apellido debe contener sólo letras");
		return;
	}
	
//	if (nombre.GetData().IsNull()) {
//		Exclamation("Debe ingresar el/los nombre/s");
//		return;
//	}
//	
//	if (! NombreyApellidoValido(nombre.GetData())) {
//		Exclamation("El nombre debe contener sólo letras");
//		return;
//	}
	
	if (fecha.GetData().IsNull()) {
		Exclamation("Debe ingresar la fecha de nacimiento.");
		return;
	}
	
	if (! fecha.Accept())
		return;
	
	if (tipo_dni.GetIndex() == 0) {
		Exclamation("Debe elegir el tipo de documento");
		return;
	}
	if (tipo_dni.GetIndex() == 1)
		tipo_doc = "DNI";
	if (tipo_dni.GetIndex() == 2)
		tipo_doc = "LC";
	if (tipo_dni.GetIndex() == 3)
		tipo_doc = "LE";		
	if (tipo_dni.GetIndex() == 4)
		tipo_doc = "Pasaporte";
			
	if (nro_dni.GetLength() < 7) {
		Exclamation("El formato del documento es incorrecto");
		return;
	}
	
	if (! DocumentoValido(nro_dni.GetData())) {
		Exclamation("El Documento debe contener sólo números");
		return;
	}
	
	if (calle.GetData().IsNull()) {
		Exclamation("Debe ingresar la calle");
		return;
	}
		
	if (numero_calle.GetData().IsNull()) {
		Exclamation("Debe ingresar el número de calle");
		return;
	}
	
	if (ciudad.GetData().IsNull()) {
		Exclamation("Debe ingresar la ciudad");
		return;	
	}
	
	if (tel_numero.GetData().IsNull()) {
		Exclamation("Debe ingresar el número de teléfono");
		return;
	}
	
	if (! ValidarTelefono(tel_numero.GetData())) {
		Exclamation("El telefono ingresado es incorrecto. Compruebe que contiene solo números");
		return;
	}
	
	if (! tel_numero_alter.GetData().IsNull()) {
		if (! ValidarTelefono(tel_numero_alter.GetData())) {
			Exclamation("El telefono alternativo es incorrecto. Compruebe que contiene sólo números");
			return;
		}
	}
	
	if (! mail.GetData().IsNull()) {
		if (! EmailValido(mail.GetData())) {
			Exclamation("La dirección de e-mail parece no ser una dirección válida. Compruebe que es correcta e intente nuevamente");
			return;
		}
	}
	
	if (nro_socio.GetData().IsNull()) {
		Exclamation("Debe ingresar el Nro. de Socio");
		return;
	}
	
	if (ley.GetData().IsNull()) {
		Exclamation("Debe ingresar la ley");
		return;
	}
	
	if (ley.GetLength() == 1) {
		Exclamation("La ley debe ser de dos dígitos");
		return;
	}
	
	if (! (SQL * sql_ctrls.Update(SOLICITUD).Where(DNI == dni_seleccionado) (TIPO_DOC,tipo_doc) (TIPO_SOCIO,~tipo_socio) (BENEFICIO,~beneficio))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	
	Hide();
	
	PromptOK("La modificación se realizó exitosamente");
	
	lista_padre->Query();
	lista_padre->FindSetCursor(dni_seleccionado);
	Close();
}

//==============================================================================================
RegistroSocioDlg::RegistroSocioDlg()
{
	CtrlLayoutCancel(*this, "Registro de Socios");
	Icon(CentroJyPImg::icono_min32x32(),CentroJyPImg::icono());
	cancel.SetImage(CentroJyPImg::cancelar());
	registrar_btn.SetImage(CentroJyPImg::nuevo_afiliado());
	
	mes_abonar.Add("- Mes -")
		.Add("Enero")
		.Add("Febrero")
		.Add("Marzo")
		.Add("Abril")
		.Add("Mayo")
		.Add("Junio")
		.Add("Julio")
		.Add("Agosto")
		.Add("Septiembre")
		.Add("Octubre")
		.Add("Noviembre")
		.Add("Diciembre")
	;
	mes_abonar.SetIndex(0);
	
	fecha_registro <<= GetSysDate();
}

/**
*/
void RegistroSocioDlg::RegistrandoSocio(String dni)
{
	dni_seleccionado = dni;
	SqlId ALL("*");
	if (! (SQL * Select(ALL).From(SOLICITUD).Where(DNI == dni))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	
	while (SQL.Fetch()) {
		nro_socio.SetText(AsString(SQL[NRO_SOCIO]));
		apellido.SetText(AsString(SQL[APELLIDOS]));
/*		nombre.SetText(AsString(SQL[NOMBRES]));*/
		nro_dni.SetText(AsString(SQL[DNI]));
		ley.SetText(AsString(SQL[LEY]));
	}
	registrar_btn <<= THISBACK(AprobarSolicitud);
}

/**
 Opción para aprobar una solicitud de nuevo socio.
*/
void RegistroSocioDlg::AprobarSolicitud()
{
	if (nro_afiliado.GetData().IsNull()) {
		Exclamation("Debe ingresar el número de afiliado");
		return;
	}
	
	if (mes_abonar.GetIndex() == 0) {
		Exclamation("Por favor, eliga un mes en el que el nuevo socio debe abonar");
		return;
	}
	
	if (anio_abonar.GetLength() < 2) {
		Exclamation("Por favor, ingrese las dos últimas cifras del año");
		return;
	}
	
	if (cuota.GetData().IsNull()) {
		Exclamation("Debe ingresar la cuota");
		return;	
	}
	
	if (! fecha_registro.Accept())
		return;
			
	if (cdgo_dto.GetData().IsNull()) {
		Exclamation("Debe ingresar el código de descuento");
		return;
	}
	
	SqlId ALL("*");
	if (! (SQL * Select(ALL).From(SOLICITUD).Where(DNI == dni_seleccionado))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	
	Sql sql(pg_session), sql2(pg_session);
	while (SQL.Fetch()) {
		if (SQL[TIPO_SOCIO] == 1) {
			if (! (sql * Insert(AFILIADO) (NRO_SOCIO_A,SQL[NRO_SOCIO])(BENEFICIO_A,SQL[BENEFICIO])(TIPO_SOCIO_A,SQL[TIPO_SOCIO])
				(LEY_A,SQL[LEY])(SUB_A,sub.GetData())(CDGO_DTO_A,cdgo_dto.GetData())(NRO_AFILIADO_A,nro_afiliado.GetData())
				(TIPO_DOC_A,SQL[TIPO_DOC])(DNI_A,SQL[DNI])(APELLIDOS_A,SQL[APELLIDOS])
				(CUOTA_A,cuota.GetData())(OBSERVACIONES_A,observaciones.GetData())(FECHA_NAC_A,SQL[FECHA_NAC])
				(CALLE_A,SQL[CALLE])(NRO_CALLE_A,SQL[NRO_CALLE])(PISO_A,SQL[PISO])(DPTO_A,SQL[DPTO])(BARRIO_A,SQL[BARRIO])
				(CIUDAD_A,SQL[CIUDAD])(TEL_A,SQL[TEL])(TEL_ALT_A,SQL[TEL_ALT])(MAIL_A,SQL[MAIL])
				(REPARTICION_A,SQL[REPARTICION])(CARGO_A,SQL[CARGO])(CATERORIA_A,SQL[CATEGORIA])(HABER_A,SQL[HABER])
				(MES_ABONO_A,mes_abonar.GetIndex())(ANIO_ABONO_A,anio_abonar.GetData())
				(FECHA_REGISTRO_A,fecha_registro.GetData()))) {
			
				Exclamation(sql.GetLastError());
				return;
			}
			PromptOK("Se acaba de dar de alta un nuevo Afiliado Activo.");
			if (! (sql * Insert(ALTA) (NRO_SOCIO_ALTA,SQL[NRO_SOCIO]))) {
				Exclamation(sql.GetLastError());
				return;
			}
		}
		else {
			if (! (sql2 * Insert(AFILIADOAD) (NRO_SOCIO_AD,SQL[NRO_SOCIO])(BENEFICIO_AD,SQL[BENEFICIO])(TIPO_SOCIO_AD,SQL[TIPO_SOCIO])
				(LEY_AD,SQL[LEY])(SUB_AD,sub.GetData())(CDGO_DTO_AD,cdgo_dto.GetData())(NRO_AFILIADO_AD,nro_afiliado.GetData())
				(TIPO_DOC_AD,SQL[TIPO_DOC])(DNI_AD,SQL[DNI])(APELLIDOS_AD,SQL[APELLIDOS])
				(CUOTA_AD,cuota.GetData())(OBSERVACIONES_AD,observaciones.GetData())(FECHA_NAC_AD,SQL[FECHA_NAC])
				(CALLE_AD,SQL[CALLE])(NRO_CALLE_AD,SQL[NRO_CALLE])(PISO_AD,SQL[PISO])(DPTO_AD,SQL[DPTO])(BARRIO_AD,SQL[BARRIO])
				(CIUDAD_AD,SQL[CIUDAD])(TEL_AD,SQL[TEL])(TEL_ALT_AD,SQL[TEL_ALT])(MAIL_AD,SQL[MAIL])
				(REPARTICION_AD,SQL[REPARTICION])(CARGO_AD,SQL[CARGO])(CATERORIA_AD,SQL[CATEGORIA])(HABER_AD,SQL[HABER])
				(MES_ABONO_AD,mes_abonar.GetIndex())(ANIO_ABONO_AD,anio_abonar.GetData())
				(FECHA_REGISTRO_AD,fecha_registro.GetData()))) {
		
				Exclamation(sql2.GetLastError());
				return;
			}
			PromptOK("Se acaba de dar de alta un nuevo Afiliado Adherente.");
		}
	}
	
	
	if (! (SQL * Delete(SOLICITUD).Where(DNI == dni_seleccionado))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	
	Hide();
	PromptOK("El alta se ha realizado exitosamente");
	lista_padre -> Query();
	Close();
}

//==============================================================================================

/**
 Muestra el listado de solicitudes que fueron rechazadas.
*/
ListadoSolicitudesRechazadasDlg::ListadoSolicitudesRechazadasDlg()
{
	CtrlLayoutCancel(*this, "Historial de Solicitudes Rechazadas");
	Icon(CentroJyPImg::icono_min32x32(),CentroJyPImg::icono());
	cancel.SetImage(CentroJyPImg::cancelar());
	limpiar_btn.SetImage(CentroJyPImg::limpiar_solicitudes());
	mostrar_btn.SetImage(CentroJyPImg::ver_bajas_anteriores());
	actualizar_btn.SetImage(CentroJyPImg::actualizar_vista());
	readmitir_btn.SetImage(CentroJyPImg::readmitir_solicitudes());
	
	solicitudes_rechazadas.SetSession(pg_session);
	solicitudes_rechazadas.SetTable(SOLICITUD_RECHAZADA,DNI_R);
	
	solicitudes_rechazadas.AddColumn(DNI_R,"Documento").NoEdit();
	solicitudes_rechazadas.AddColumn(APELLIDOS_R,"Apellido/s y Nombre/s").NoEdit();
/*	solicitudes_rechazadas.AddColumn(NOMBRES_R,"Nombre/s").NoEdit();*/
	solicitudes_rechazadas.AddColumn(NRO_SOCIO_R,"Nro. de Socio").NoEdit();
	solicitudes_rechazadas.AddColumn(FECHA_BAJA,"Fecha de Baja").NoEdit();
	
	solicitudes_rechazadas.SetOrderBy(APELLIDOS_R);
	solicitudes_rechazadas.Query();
	
	mostrar_btn <<= THISBACK(MostrarEntreFechas);
	actualizar_btn <<= THISBACK(Actualizar);
	limpiar_btn <<= THISBACK(LimpiarRegistros);
	readmitir_btn <<= THISBACK(ReadmitirSocio);
}

/**
 Permite limpiar el contenido de la base de datos que almacena las solicitudes
 que se han rechazado.
*/
void ListadoSolicitudesRechazadasDlg::LimpiarRegistros()
{
	if (PromptYesNo("¿Esta seguro que quiere limpiar las solicitudes rechazadas?")) {
		
		if (! (SQL * Delete(SOLICITUD_RECHAZADA))) {
			Exclamation(SQL.GetLastError());
			return;
		}
		
		PromptOK("Se han limpiado exitosamente las solicitudes realizadas");
		solicitudes_rechazadas.Query();
	}
}

/**
 Muestra las solicitudes realizadas entre dos fechas. Se deberán elegir las dos fechas
 para poder aplicar el filtro.
*/
void ListadoSolicitudesRechazadasDlg::MostrarEntreFechas()
{
	if (desde.GetData().IsNull()) {
		Exclamation("Se debe elegir la fecha inicial");
		return;
	}
	
	if (hasta.GetData().IsNull()) {
		Exclamation("Se debe elegir la fecha final");
		return;
	}
	
	SqlBool where = FECHA_BAJA >= desde.GetData() && FECHA_BAJA <= hasta.GetData();
	solicitudes_rechazadas.SetWhere(where);
	solicitudes_rechazadas.Query();
}

void ListadoSolicitudesRechazadasDlg::Actualizar()
{
	solicitudes_rechazadas.Query(true);
}

void ListadoSolicitudesRechazadasDlg::ReadmitirSocio()
{
	if (solicitudes_rechazadas.IsCursor()) {
		if (PromptYesNo("¿Esta seguro que quiere readmitir el socio seleccionado?")) {
			
			SqlId ALL("*");
			if (! (SQL * Select(ALL).From(SOLICITUD_RECHAZADA).Where(DNI_R == solicitudes_rechazadas.GetKey()))) {
				Exclamation(SQL.GetLastError());
				return;
			}
			
			Sql sql(pg_session);
			while (SQL.Fetch()) {
				
				if (! (sql * Insert(SOLICITUD) (DNI,SQL[DNI_R])(APELLIDOS,SQL[APELLIDOS_R])
					(FECHA_NAC,SQL[FECHA_NAC_R])(TIPO_DOC,SQL[TIPO_DOC_R])(CALLE,SQL[CALLE_R])(NRO_CALLE,SQL[NRO_CALLE_R])
					(PISO,SQL[PISO_R])(DPTO,SQL[DPTO_R])(BARRIO,SQL[BARRIO_R])(CIUDAD,SQL[CIUDAD_R])(TEL,SQL[TEL_R])
					(TEL_ALT,SQL[TEL_ALT_R])(MAIL,SQL[MAIL_R])(NRO_SOCIO,SQL[NRO_SOCIO_R])(LEY,SQL[LEY_R])
					(TIPO_SOCIO,SQL[TIPO_SOCIO_R])(BENEFICIO,SQL[BENEFICIO_R])(REPARTICION,SQL[REPARTICION_R])
					(CARGO,SQL[CARGO_R])(CATEGORIA,SQL[CATEGORIA_R])(HABER,SQL[HABER_R]))) {
						Exclamation(sql.GetLastError());
						return;
					}
			}
			
			if (! (SQL * Delete(SOLICITUD_RECHAZADA).Where(DNI_R == solicitudes_rechazadas.GetKey()))) {
				Exclamation(SQL.GetLastError());
				return;
			}
			
			PromptOK("El socio se ha readmitido exitosamente");
			solicitudes_rechazadas.Query();
			lista_padre -> Query();
			lab_cant_solic -> SetText(AsString(lista_padre -> GetCount()));
		}
	}
}
